package org.acb.sgp.dao.impl;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.acb.sgp.beans.Escena;
import org.acb.sgp.dao.EscenaDao;
import org.acb.sgp.factory.ConnectionFactory;

public class EscenaDaoImpl implements EscenaDao {

    private Connection con;
    private CallableStatement cs;
    private ResultSet rs;

    private Connection getConnection() throws SQLException {
        return ConnectionFactory.getInstance().getConnection();
    }

    @Override
    public void registrarEscena(Escena escena) {
        try {
            String sql = "{Call RegistrarEscena(?,?,?,?,?,?,?,?,?)}";
            con = getConnection();
            cs = con.prepareCall(sql);
            cs.setInt(1, escena.getEpisodio().getCodEpisodio());
            cs.setInt(2, escena.getPrograma().getCodPrograma());
            cs.setDate(3, new java.sql.Date(escena.getFecGrabacion().getTime()));
            cs.setDate(4, new java.sql.Date(escena.getFecGrabacionInicio().getTime()));
            cs.setDate(5, new java.sql.Date(escena.getFecGrabacionFin().getTime()));
            cs.setInt(6, escena.getEstado().getCodEstado());
            cs.setInt(7, escena.getNumEscena());
            cs.setInt(8, escena.getLocacion().getCodLocacion());
            if (escena.getCodEscena() == null) {
                cs.setInt(9, 0);
                cs.registerOutParameter(9, Types.INTEGER);
                cs.execute();
                escena.setCodEscena((Integer) cs.getObject(9));
            } else {
                cs.setInt(9, escena.getCodEscena());
                cs.execute();
            }
        } catch (SQLException ex) {
            Logger.getLogger(EscenaDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
    }

    @Override
    public void eliminarEscena(Escena escena) {

    }

    @Override
    public Escena buscarEscenaPorCodigo(Integer codEscena) {
        Escena escena = new Escena();
        try {
            String sql = "{Call BuscarEscenaPorCodigo(?)}";
            con = getConnection();
            cs = con.prepareCall(sql);
            cs.setInt(1, codEscena);
            rs = cs.executeQuery();
            if (rs.next()) {
                escena = llenar(rs);
            }
        } catch (SQLException ex) {
            Logger.getLogger(EscenaDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
        return escena;
    }

    @Override
    public List<Escena> buscarEscenasPorEpisodioPrograma(Integer codEpisodio, Integer codPrograma) {
        List<Escena> escenas = new ArrayList<Escena>();
        try {
            String sql = "{Call BuscarEscenasPorEpisodioPrograma(?,?)}";
            con = getConnection();
            cs = con.prepareCall(sql);
            cs.setInt(1, codEpisodio);
            cs.setInt(2, codPrograma);
            rs = cs.executeQuery();
            while (rs.next()) {
                escenas.add(llenar(rs));
            }
        } catch (SQLException ex) {
            Logger.getLogger(EscenaDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
        return escenas;
    }

    private Escena llenar(ResultSet rs) throws SQLException {
        Escena escena = new Escena();
        escena.setCodEscena(rs.getInt("codEscena"));
        escena.getEpisodio().setCodEpisodio(rs.getInt("codEpisodio"));
        escena.getPrograma().setCodPrograma(rs.getInt("codPrograma"));
        escena.setFecGrabacion(rs.getDate("fecGrabacion"));
        escena.setFecGrabacionInicio(rs.getDate("fecGrabacionInicio"));
        escena.setFecGrabacionFin(rs.getDate("fecGrabacionFin"));
        escena.getEstado().setCodEstado(rs.getInt("codEstado"));
        escena.setNumEscena(rs.getInt("numEscena"));
        escena.getLocacion().setCodLocacion(rs.getInt("codLocacion"));
        escena.getLocacion().setNomLocacion(rs.getString("nomLocacion"));
        escena.getLocacion().setStrDireccion(rs.getString("strDireccion"));
        escena.getLocacion().setNomContacto(rs.getString("nomContacto"));
        escena.getLocacion().setStrTelefono(rs.getString("telContacto"));
        escena.getLocacion().getDistrito().setCodDistrito(rs.getInt("codDistrito"));
        escena.getLocacion().getDistrito().setNomDistrito(rs.getString("nomDistrito"));
        escena.getLocacion().getCategoria().setCodCategoria(rs.getInt("codCategoria"));
        escena.getLocacion().getCategoria().setNomCategoria(rs.getString("nomCategoria"));
        return escena;
    }

}
